package com.s7.recycler.adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.s7.recycler.holder.BaseHolder;
import com.s7.recycler.holder.BaseViewHolder;
import com.s7.recycler.listener.Recycler;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by Administor on 2018\7\10 0010.
 * RecyclerView 基础适配器
 */
public abstract class CompatRecyclerAdapter<T> extends RecyclerView.Adapter<BaseHolder> {

    protected List<T> datas;

    public CompatRecyclerAdapter() {
        if (this.datas == null) {
            this.datas = new ArrayList<>();
        }
    }

    public CompatRecyclerAdapter(List<T> datas) {
        this.datas = datas;
    }

    /**
     * 传入数组
     * @param data
     */
    public CompatRecyclerAdapter(T[] data) {
        if (data != null && data.length > 0) {
            this.datas.addAll(Arrays.asList(data));
        }
    }

    /**
     * 加载布局获取控件
     * @param parent
     * @param id
     * @return
     */
    protected View getView(ViewGroup parent, @LayoutRes int id) {
        return LayoutInflater.from(parent.getContext()).inflate(id, parent, false);
    }

    protected Recycler.OnCheckedChangeListener mCheckedChange;
    protected Recycler.OnClickListener<T> mClick;
    protected Recycler.OnItemClickListener<T> mItemClick;
    protected Recycler.OnItemLongClickListener<T> mItemLongClick;

    /**
     * 给Item 绑定点击事件 和 长按事件
     * @param holder
     * @param data
     */
    protected void initClickListener(final BaseViewHolder holder, final T data) {
        if (mItemClick != null)
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mItemClick.onItemClick(holder.getItemView(), holder.getRealPosition(), data);
                }
            });

        if (mItemLongClick != null) {
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    mItemLongClick.onItemLongClick(holder.getItemView(), holder.getRealPosition(), data);
                    return false;
                }
            });
        }
    }

    /**
     * 设置选择事件
     * @param mCheckedChange
     * @return
     */
    public CompatRecyclerAdapter setCheckedChange(Recycler.OnCheckedChangeListener<T> mCheckedChange) {
        this.mCheckedChange = mCheckedChange;
        return this;
    }

    /**
     * 设置子view点击事件
     * @param mClick
     * @return
     */
    public CompatRecyclerAdapter setClick(Recycler.OnClickListener<T> mClick) {
        this.mClick = mClick;
        return this;
    }

    /**
     * 设置 Item 点击事件
     * @param mItemClick
     * @return
     */
    public CompatRecyclerAdapter setItemClick(Recycler.OnItemClickListener<T> mItemClick) {
        this.mItemClick = mItemClick;
        return this;
    }

    /**
     * 设置 Item 长按事件
     * @param mItemLongClick
     * @return
     */
    public CompatRecyclerAdapter setItemLongClick(Recycler.OnItemLongClickListener<T> mItemLongClick) {
        this.mItemLongClick = mItemLongClick;
        return this;
    }

    @Override
    public int getItemCount() {
        return datas == null ? 0 : datas.size();
    }

    /**
     * 初始化集合
     */
    public void initData() {
        if (this.datas == null) {
            this.datas = new ArrayList<>();
        }
    }

    /**
     * 获取所有数据
     * @return
     */
    public List<T> getDatas() {
        return datas;
    }

    /**
     * 获取数据数量
     * @return
     */
    public int getSize() {
        return datas != null ? datas.size() : 0;
    }

    /**
     * 集合中是否存在数据
     * @return
     */
    public boolean isEmpty() {
        return (datas != null ? datas.size() : 0) == 0;
    }

    /**
     * 刷新列表数据
     *
     * @param datas
     * @return
     */
    public void refresh(List<T> datas) {
        if (datas != null && datas.size() > 0) {
            this.datas.clear();
            this.datas.addAll(datas);
            notifyDataSetChanged();
        }
    }

    /**
     * 添加数据
     * @param datas
     */
    public void add(List<T> datas) {
        this.datas.addAll(datas);
        notifyDataSetChanged();
    }

    /**
     * 添加数据
     * @param data
     */
    public void add(T data) {
        this.datas.add(data);
        notifyItemInserted(this.datas.size() - 1);
    }

    /**
     * 给指定位置添加一项
     *
     * @param pos
     * @param data
     * @return
     */
    public void add(int pos, T data) {
        this.datas.add(pos, data);
        notifyItemInserted(pos);
    }


    /**
     * 替换指定位置的内容
     * @param position
     * @param data
     */
    public void replace(int position, T data) {
        this.datas.set(position, data);
        notifyItemChanged(position);
    }

    /**
     * 删除指定位置的内容
     * 当集合为空时显示空白页
     *
     * @param position
     */
    public void remove(int position) {
        this.datas.remove(position);
        notifyItemRemoved(position);
    }

    /**
     * 清除数据
     */
    public void clear() {
        if (!isEmpty()) {
            this.datas.clear();
            notifyDataSetChanged();
        }
    }

}
